// #include <stdio.h>
#include <intrins.h>
// #include <string.h>
#include "nrf24l01.h"

uchar name = 'C'; //模块标记
uchar flag = 0;   //是否发送数据标志
uchar busy = 1;
uchar temp = 0;
//adc0832
// sbit CS = P3 ^ 5;  // chip select
// sbit CLK = P3 ^ 6; // clock
// sbit DIO = P3 ^ 7; // data input and output

//数码管位选
// sbit qian = P2 ^ 4;
// sbit bai = P2 ^ 5;
// sbit shi = P2 ^ 6;
// sbit ge = P2 ^ 7;
// 数码管数值
// uchar code ledData[] = {
//     0x3F, //"0"
//     0x06, //"1"
//     0x5B, //"2"
//     0x4F, //"3"
//     0x66, //"4"
//     0x6D, //"5"
//     0x7D, //"6"
//     0x07, //"7"
//     0x7F, //"8"
//     0x6F, //"9"
//     0x77, //"A"
//     0x7C, //"B"
//     0x39, //"C"
//     0x5E, //"D"
//     0x79, //"E"
//     0x71, //"F"
//     0x76, //"H"
//     0x38, //"L"
//     0x37, //"n"
//     0x3E, //"u"
//     0x73, //"P"
//     0x5C, //"o"
//     0x40, //"-"
//     0x00  //清空
// };

/*
* 延时2微秒
* 
* @return
*/
void delay2us()
{
    _nop_();
    _nop_();
}

/*
* AD转换
*
* @return 输出数据
*/
// uchar get_AD_Res()
// {
//     uchar i, data1 = 0, data2 = 0;
//     CS = 0;
//     //第一个周期：转换开始
//     CLK = 0;
//     DIO = 1;
//     delay2us();
//     CLK = 1;
//     delay2us();
//     //第二个周期：选择单通道还是双通道 DIO=0双通道差分 或 DIO=1单通道
//     CLK = 0;
//     DIO = 1;
//     delay2us();
//     CLK = 1;
//     delay2us();
//     //第三个周期：DIO选择CH1-->如果DIO=0 选择CH0
//     CLK = 0;
//     DIO = 0;
//     delay2us();
//     CLK = 1;
//     delay2us();
//     //等待
//     CLK = 0;
//     DIO = 1;
//     delay2us();
//     //先进来的为最高位，后进来为最低位
//     for (i = 0; i < 8; i++)
//     {
//         CLK = 1;
//         delay2us();
//         CLK = 0;
//         delay2us();
//         /*
// 		* 0000_0000|0000_000想=0000_000想
// 		* 0000_00想0|0000_000翔=0000_00想翔
// 		* 0000_0想翔0|0000_000子=0000_0想翔子
// 		*/
//         data1 = (data1 << 1) | (uchar)DIO;
//     }
//     //先进来的为最低位，后进来为最高位
//     for (i = 0; i < 8; i++)
//     {
//         /*
// 		* 0000_0000|0000_000子=0000_000子
// 		* 0000_000子|0000_00翔0=0000_00翔子
// 		* 0000_00翔子|0000_0想00=0000_0想翔子
// 		*/
//         data2 = data2 | (uchar)DIO << i;
//         CLK = 1;
//         delay2us();
//         CLK = 0;
//         delay2us();
//     }
//     //禁止片选
//     CS = 1;
//     return (data1 == data2) ? data1 : 0;
// }

/***********************************************
函数：uartInit()
描述：
    串口初始化 printf用
************************************************/
void Uart_Init() //初始化函数
{
    SCON = 0x50;            //串口通信工作方式1,REN=1
    TMOD |= 0x20;           //定时器1的工作方式2
    TH1 = 0xfd, TL1 = 0xfd; //波特率9600
    TI = 1;                 //这里一定要注意
    TR1 = 1;                //打开定时器
    ES = 1;                 //打开串口中断
}
void UartSendByte(uchar b)
{
    SBUF = b;
    while (busy)
        ;
    busy = 1;
}
//------------------------------
//         定时器0初始化
//------------------------------
// void ET0_init()
// {
//     TMOD &= 0xf0; //定时器0
//     TMOD |= 0x01;
//     TH0 = (65536 - 2000) / 256; //2ms溢出
//     TL0 = (65536 - 2000) % 256;
//     ET0 = 1;
//     TR0 = 1;
// }

// //---------------------------------
// //         定时器1初始化
// //-----------------------------------
// void ET1_init()
// {
//     TMOD &= 0x0f;
//     TMOD |= 0x10;
//     TH1 = (65536 - 2000) / 256; //2ms溢出
//     TL1 = (65536 - 2000) % 256;
//     ET1 = 1;
//     TR1 = 1; //打开定时器1
// }
void main()
{
    Nrf24l01_Init();
    // ET0_init();
    Uart_Init();
    // ET1_init();
    EA = 1; //打开总中断
    // CLK = 0; //ADC0832初始化
    // CS = 1;
    TX_BUF[0] = name;
    TX_BUF[4] = '\n';
    while (1)
    {
        TX_BUF[1] = temp++;
        TX_BUF[2] = temp++;
        TX_BUF[3] = temp++;
        if (temp > 8)
            temp = 0;
        UartSendByte(TX_BUF[0]);
        UartSendByte(TX_BUF[1] + 0x30);
        UartSendByte(TX_BUF[2] + 0x30);
        UartSendByte(TX_BUF[3] + 0x30);
        UartSendByte(TX_BUF[4]);
        TX_Mode(TX_BUF); // 把nRF24L01设置为发送模式并发送数据
        Check_ACK(1);    // 等待发送完毕，清除TX FIFO
        DelayMS(250);
        DelayMS(250);
    }
}
//---------------------------------
//            定时器0中断
//---------------------------------
// void ET0_INT() interrupt 1
// {
//     static uchar w;
//     TH0 = (65536 - 2000) / 256; // 重装初值
//     TL0 = (65536 - 2000) % 256;
//     P2 |= 0xf0; //消影
//     switch (w)  //位选，选择点亮的数码管，
//     {
//     case (0):
//         P0 = ledData[name - 0x37];
//         qian = 0;
//         break; //显示千位
//     case (1):
//         P0 = ledData[TX_BUF[1]] | 0x80;
//         bai = 0;
//         break; //显示百位
//     case (2):
//         P0 = ledData[TX_BUF[2]];
//         shi = 0;
//         break; //显示十位
//     case (3):
//         P0 = ledData[TX_BUF[3]];
//         ge = 0;
//         break; //显示个位
//     }
//     w++;
//     if (w == 4)
//     {
//         w = 0;
//     }
// }
// void ET0_INT() interrupt 1
// {
//     // uchar AD;
//     // uint d;
//     TH1 = (65536 - 2000) / 256; // 重装初值
//     TL1 = (65536 - 2000) % 256;
//     if (flag == 0)
//     {
//         // AD = get_AD_Res();
//         // d = 821; //d需uint 多40
//         // TX_BUF[3] = d % 10;
//         // TX_BUF[2] = d / 10 % 10;
//         // TX_BUF[1] = d / 100 % 10;
//         TX_BUF[4] = '\n';
//         TX_BUF[3] = temp++;
//         TX_BUF[2] = temp++;
//         TX_BUF[1] = temp++;
//         TX_BUF[0] = name;
//         if (temp > 8)
//             temp = 0;
//         flag = 1;
//     }
// }
void UartInterrupt() interrupt 4
{
    if (RI)
    {
        RI = 0;
    }
    if (TI)
    {
        TI = 0;
        busy = 0;
    }
}
//---------------------------------------------
//        定时器T1中断服务程序
//---------------------------------------------
// void ET1_INT() interrupt 3
// {
//     uchar AD;
//     uint d;
//     TH1 = (65536 - 2000) / 256; // 重装初值
//     TL1 = (65536 - 2000) % 256;
//     if (flag == 0)
//     {
//         AD = get_AD_Res();
//         d = AD * 500.0 / 256.0; //d需uint 多40
//         TX_BUF[3] = d % 10;
//         TX_BUF[2] = d / 10 % 10;
//         TX_BUF[1] = d / 100 % 10;
//         TX_BUF[0] = name;
//         TX_BUF[4] = '\n';
//         flag = 1;
//     }
// }
